package at.ac.tuwien.vpsbcm.spielzeugfabrik.alternativ;

import java.util.Random;

import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;

import at.ac.tuwien.vpsbcm.spielzeugfabrik.alternativ.teile.Schornstein;

import at.ac.tuwien.vpsbcm.spielzeugfabrik.alternativ.teile.Holzgehaeuse;

import at.ac.tuwien.vpsbcm.spielzeugfabrik.BauteilEnum;
import at.ac.tuwien.vpsbcm.spielzeugfabrik.alternativ.communication.LokTopicQueueConnHandler;
import at.ac.tuwien.vpsbcm.spielzeugfabrik.alternativ.teile.Rad;

public class ProduzentAlternativ  implements Runnable {

    public static final int DELAY_MIN_MS = 1000;
    public static final int DELAY_MAX_MS = 3000;
    
    private LokTopicQueueConnHandler lokTopicQueueConnHandler;
    private TopicSession topicSession;
    private TopicPublisher topicPublisher;
    
    private int id;
    private BauteilEnum bauteil;
    private int anzahl;
    private GUIAlternativ gui;

    public ProduzentAlternativ(int id, BauteilEnum bauteil, int anzahl) throws JMSException  {
        this.anzahl = anzahl;
        this.bauteil = bauteil;
        this.id = id;        
    	lokTopicQueueConnHandler = LokTopicQueueConnHandler.getInstance();
    	topicSession = lokTopicQueueConnHandler.getConnection();
        topicPublisher = lokTopicQueueConnHandler.getTopPublisher();     
    }
      
    public void run() {
    	int teilId = 1;
        int i;
        Random rand = new Random();
        teilId = rand.nextInt(100);
        System.out.format("Started Thread for Producer %d, Part %s\n", this.id, this.bauteil);
        for (i = 0; i < this.anzahl; i++) {
            try {
                Thread.sleep(rand.nextInt(DELAY_MAX_MS - DELAY_MIN_MS + 1) + DELAY_MIN_MS);
                ObjectMessage message = topicSession.createObjectMessage();
                switch (bauteil) {
                    case RAD:
                        Rad rad = new Rad();
                        rad.setId(i);
                        rad.setProduzentenId(id);
                        rad.setName("Rad");
//                      teilId++;
                        //System.out.println("TeilID: " + teilId);
                        message.setStringProperty("bauteil","Rad");
                        message.setObject(rad);
                        break;
                    case HOLZGEHAEUSE:
                        Holzgehaeuse holzgehaeuse = new Holzgehaeuse();
                        holzgehaeuse.setId(i);
                        holzgehaeuse.setProduzentenId(id);
                        holzgehaeuse.setName("Gehaeuse");
//                      teilId++;
                        message.setStringProperty("bauteil","Holzgehaeuse");
                        message.setObject(holzgehaeuse);
                        break;
                    case SCHORNSTEIN:
                        Schornstein schornstein = new Schornstein();
                        schornstein.setId(i);
                        schornstein.setProduzentenId(id);
                        schornstein.setName("Schornstein");
//                      teilId++;
                        message.setStringProperty("bauteil","Schornstein");
                        message.setObject(schornstein);
                        break;
                }   
                topicPublisher.publish(message);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (JMSException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            System.out.format("Producer %d, Part %s, Number %d\n", this.id, this.bauteil, i);
        }
        System.out.format("Stopping Thread for Producer %d, Part %s\n", this.id, this.bauteil);
    }
}
